package main //必须

import "fmt"

// 函数声明样例
// func method(形参a int,形参b float)(返回值c,返回值d){
// 	return a,b
// }
// 注:函数首字母小写代表是私有函数private，大写代表是共有函数public
/////////////////////////////////////////////////////////////////////
// 无参无返回值函数
func printA() {
	a := 55
	fmt.Printf("a is %d\n", a)
}

// 有参无返回值
func printB(a string, b int64) {
	fmt.Printf("a is %s,b is %d\n", a, b)
}

/////////////////////////////////////////////////////////////////////
// 同样的参数类型可以省略
func printC(a, b, c int64) {
	a = 10
	fmt.Printf("a = %d,b=%d,c=%d\n", a, b, c)
}

func printD(a, b int, c, d string) {
	fmt.Printf("a=%d,b=%d,c=%s,d=%s \n", a, b, c, d)
}

/////////////////////////////////////////////////////////////////////
// 传递多个参数
func testMultiple1(args ...int) {
	fmt.Println("测试多个参数")

	for _, item := range args {
		fmt.Print(item, ",")
	}

	//testMultiple2(args[:2]...) //传递args 0~2的参数(不包括args[2])
	testMultiple2(args[2:]...)  //传递args 2-以后的的参数(包括args[2])
	testMultiple2(args[2:4]...) //传递args 2-4的参数(包括args[2]，但不包括args[4])
}

func testMultiple2(args ...int) {
	fmt.Println("测试多个参数部分传递")
	for _, item := range args {
		fmt.Print(item, ",")
	}
}

/////////////////////////////////////////////////////////////////////
// 无参有返回值
func testReturn1() int {
	return 666
}

// go推荐写法，也是常用写法
func testReturn2() (result int) {
	result = 555
	return
}

// go推荐写法
func testReturn3() (result int) {
	result = 555
	return result
}

/////////////////////////////////////////////////////////////////////
// 无参有多个返回值

func testReturn4() (a int, b int, c int) {
	return 111, 222, 333
}

// 相同类型可省略
func testReturn5() (a, b, c int) {
	return 111, 222, 333
}

// 推荐写法
func testReturn6() (a int, b int, c int) {
	a, b, c = 111, 222, 333
	return
}

func main() { //入口函数
	// 无参无返回值函数
	printA()
	// 有参无返回值
	printB("hello", 25)
	printC(1, 2, 3)
	printD(1, 2, "hello", "world")
	// 多参数测试
	testMultiple1(0, 1, 2, 3, 4, 5)

	// 测试无参有一个返回值
	var a = testReturn1()
	fmt.Println("return1: a=", a)
	a = testReturn2()
	fmt.Println("return2: a=", a)
	a = testReturn3()
	fmt.Println("return3: a=", a)
	// 测试无参有多个返回值
	var a1, b1, c1 = testReturn4()
	fmt.Printf("a1=%d,b1=%d,c1=%d\n", a1, b1, c1)
	var a2, b2, c2 = testReturn5()
	fmt.Printf("a2=%d,b2=%d,c2=%d\n", a2, b2, c2)
	var a3, b3, c3 = testReturn6()
	fmt.Printf("a3=%d,b3=%d,c3=%d\n", a3, b3, c3)
}
